import re
import urllib.request as ur
import user_agent
import lxml.etree as le
import json
import pymongo
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
#%%
# 定义获取一级职位信息的函数
def parse1_job(keyword, page):
    url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,{},2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='.format(keyword, page)
    # 获得request
    req = ur.Request(
        url = url,
        headers = {
            'User-Agent' : user_agent.get_user_agent_pc()
        }
    )
    # 获取网页内容
    content = ur.urlopen(req).read().decode("gbk", "ingnore")

    # 用正则表达式查找文本
    job_pattern = 'window.__SEARCH_RESULT__ = (.*?)</script>'
    jobs = re.findall(job_pattern, content)[0]

    # 讲json文本写成python字典
    jobs = json.loads(jobs)

    # 从字典里找到职位关键信息
    job_info = jobs['engine_search_result']

    # 注意，job_info 是一个长度为50的列表， 因为每一页显示50个jobs, 每个列表是一个字典， 存储该职位的各种信息
    return job_info
#%%
# 搜索关键字：python, 第一页
python_result = parse1_job('python',1)

# 搜索关键字：java, 第二页
java_result = parse1_job('java', 2)

#%%

# 定义一个合并列表内字符串的函数，并去掉空格和换行符
def union_xpath(split_by, xpath_list):
    xpath_list = [s.strip() for s in xpath_list]
    result = split_by.join(xpath_list)
    return result


#%%
# 定义获取二级职位信息的函数

def parse2_job(url2):
    # 网页没有java script渲染， 用xpath获取信息
    # 获取网页内容
    req = ur.Request(
        url = url2,
        headers = {
            'USer-Agent':user_agent.get_user_agent_pc()
        }
    )

    # 解码
    content = ur.urlopen(req).read().decode('gbk', 'ignore')

    # 转码成xpath可以读的文本
    contentx = le.HTML(content)

    # 逐个提取所需信息
    job_info = contentx.xpath('//div[@class= "tCompany_main"]/div[@class = "tBorderTop_box"][1]//text()')
    job_add = contentx.xpath('//div[@class= "tCompany_main"]/div[@class = "tBorderTop_box"][2]//text()')
    job_company = contentx.xpath('//div[@class= "tCompany_main"]/div[@class = "tBorderTop_box"][3]//text()')

    # 合并列表内容为一个字符串
    job_info = union_xpath('-', job_info)
    job_add = union_xpath('-', job_add)
    job_company = union_xpath('-', job_company)

    # 结果返回为一个字典
    return dict(
        job_info = job_info,
        job_add = job_add,
        job_company = job_company
    )
#%%
# 搜索'java'某页的结果的第一个职位的详细信息:
parse2_job(java_result[0]['job_href'])

#%%
# 封装函数，将结果写入MangoDB数据库
# 数据库结构： 一行为一个查询结果，每个查询结果后面添加3个列，分别为二级查询结果的细节：职位信息，联系方式，公司信息
# 因为keyword, c是没有默认值的参数，要放到有默认值的参数前面
def crawl_51job(keyword, c, page_start = 1, page_end = 5):
    for page in range(page_start, page_end+1):
        # jobs1 是50个字典组成的列表， 每个字典代表一个职位
        jobs1 = parse1_job(keyword, page)
        for job in jobs1:
            job2 = parse2_job(job['job_href'])
            job['job_info'] = job2['job_info']
            job['job_add'] = job2['job_add']
            job['job_company'] = job2['job_company']

            # 每个职位信息收集完毕，添加到数据库
            c.insert_one(job)

if __name__ == '__main__':
    keyword = input('请输入查询关键字：')
    page_start = int(input('请输入起始页码， 每页有50个职位哦：'))
    page_end = int(input('请输入完结页码， 每页有50个职位哦：'))
    # 建立数据库连接
    client = pymongo.MongoClient()

    # 生成一个新的数据库
    db = client.get_database('51job')
    c = db.get_collection('{}_page{}-{}'.format(keyword, page_start, page_end))

    # 调用51job爬虫函数
    crawl_51job(keyword=keyword, c=c, page_start=page_start, page_end=page_end)





